import {
  BoxHelper,
  Color,
  Object3D
} from 'three';
import type Viewer from '../Viewer';

export default class BoxHelperWrap {
  protected viewer: Viewer;
  public boxHelper: BoxHelper;

  constructor (viewer: Viewer, color?: number) {
    this.viewer = viewer;
    const boxColor = color === undefined ? 0x00ffff : color;
    this.boxHelper = new BoxHelper(new Object3D(), new Color(boxColor));
    // // @ts-expect-error
    // this.boxHelper.material.depthTest = false;

    this.initBoxHelperWrap();
  }

  // initBoxHelperWrap 方法用于将 boxHelper 添加到 viewer 的场景中。
  private initBoxHelperWrap () {
    this.viewer.scene.add(this.boxHelper);
  }

  // setVisible 方法用于控制 boxHelper 的可见性
  public setVisible (visible: boolean): void {
    this.boxHelper.visible = visible;
  }

  // attach 方法用于关联一个 Object3D 对象，根据该对象的位置和大小来设置 boxHelper 的辅助框。
  public attach (obj: Object3D): void {
    // 调用 boxHelper.setFromObject(obj) 方法，根据传入的 obj 对象的位置和大小来设置 boxHelper 的辅助框，以便与该对象对齐和显示。
    this.boxHelper.setFromObject(obj);
    // 调用 setVisible(true) 方法将 boxHelper 设置为可见状态，确保辅助框在场景中可以被看到。
    this.setVisible(true);
  }

  // dispose 方法用于销毁 boxHelper 对象，移除它从父节点中以及清空其属性。
  public dispose (): void {
    // 首先获取 boxHelper 的父节点，并保存在 parent 变量中。
    const parent = this.boxHelper.parent;
    // 如果 parent 不为 null（即 boxHelper 有父节点），则调用 parent.remove(this.boxHelper) 方法将 boxHelper 从其父节点中移除。
    if (parent !== null) {
      parent.remove(this.boxHelper);
    }
    // 使用 Object.keys(this).forEach 遍历 this 对象的所有属性。
    // 在循环中，通过 this[key] = null 将每个属性置为 null，从而清空 BoxHelperWrap 实例的所有属性。
    Object.keys(this).forEach(key => {
      // @ts-expect-error
      this[key] = null;
    });
  }
}
